<?php

declare(strict_types=1);

namespace app\model;

use app\eslib\EsArray;
use PDOException;
use think\Model;
use think\facade\Db;
use think\exception\ValidateException;
use app\eslib\EsUtils;
use app\eslib\EsString;
use app\validate\admin\AuthRulesValidate;

/**
 * 权限规则 模型类
 * @version 1.0.0
 */
class AuthRulesModel extends Model
{
    // 数据表名称常量
    const TABLE_NAME = 'sw_auth_rules';

    // 设置当前模型对应的完整数据表名称
    protected $table = self::TABLE_NAME;

    // 开启自动时间戳（默认为整型int）
    protected $autoWriteTimestamp = true;

    // 定义时间戳字段名
    protected $createTime = 'created_at';
    protected $updateTime = 'updated_at';

    /**
     * 返回 状态 访问器的枚举数据
     */
    public $status_data = [0 => '禁用', 1 => '正常'];

    /**
     * 返回 状态 访问器的值
     */
    public function getStatusTextAttr()
    {
        $value = $this->getData('status');
        if (is_numeric($value)) {
            $value = intval($value);
        }
        return $this->status_data[$value] ?? $value;
    }

    /**
     * 使用视图查询
     */
    public function scopeDbView($query)
    {
        return $query->table('v_sw_auth_rules');
    }

    /**
     * 复制指定的记录
     */
    public static function doCopy($id)
    {
        $data = Db::table(self::TABLE_NAME)->where('id', $id)->toArray();
        $data['title'] .= ' - 副本';
        unset($data['id']);
        unset($data['created_at']);
        unset($data['updated_at']);
        try {
            $id = Db::table(self::TABLE_NAME)->insertGetId($data);
            return EsUtils::stdMessage(true, '', $id);
        } catch (PDOException $ex) {
            return EsUtils::stdMessage(false, $ex->getMessage());
        }
    }

    /**
     * 显示资源列表
     */
    static public function doIndex($searchText, $pageSize)
    {
        $data = self::dbView()->where(function ($query) use ($searchText) {
            if ($searchText) {
                $query->where(function ($query) use ($searchText) {
                    $query->where('id', intval($searchText))->whereOr('name', 'like', "%{$searchText}%");
                });
            }
        })->order('status')->order('id', 'desc')->paginate($pageSize);

        return EsUtils::stdMessage(true, '', $data);
    }

    /**
     * 显示指定的资源
     * @param int $id 主键编号
     */
    static public function doRead($id)
    {
        if (empty($id) || !is_numeric($id)) {
            return EsUtils::stdMessage(false, '参数无效', $id);
        }
        if ($id > 0) {
            $model = self::find($id);
            if (!$model) {
                return EsUtils::stdMessage(false, '记录不存在');
            }
        } else {
            $model = new self();
            $model->status = 1;
        }
        $data = [
            'data' => $model,
            'status_data' => $model->status_data(),
        ];
        return EsUtils::stdMessage(true, $id, $data);
    }

    /**
     * 保存新建的资源
     * @param array $data 表单数据
     */
    static public function doSave($data)
    {
        try {
            validate(AuthRulesValidate::class)->scene('save')->check($data);
        } catch (ValidateException $ex) {
            // 验证失败 输出错误信息
            return EsUtils::stdMessage(false, $ex->getError());
        }
        try {
            $id = Db::table(self::TABLE_NAME)->insertGetId($data);
            EsUtils::stdMessage(true, '', $id);
        } catch (PDOException $ex) {
            EsUtils::stdMessage(false, $ex->getMessage());
        }
    }

    /**
     * 保存更新的资源
     * @param int $id 主键编号
     * @param array $data 表单数据
     * @param string $mode 特殊模式的更新操作，例如 copy, update_one
     */
    static public function doUpdate($id, $data)
    {
        $mode = $data['_mode'] ?? '';
        // 特殊模式的更新操作
        switch ($mode) {
            case 'copy':
                // 复制指定的资源
                try {
                    $affected = self::copy($id);
                    EsUtils::stdMessage(true, '', $affected);
                } catch (\Exception $ex) {
                    EsUtils::stdMessage(false, $ex->getMessage());
                }
            default:
                break;
        }

        // 校验表单参数
        try {
            validate(AuthRulesValidate::class)->scene('update')->check($data);
        } catch (ValidateException $ex) {
            // 验证失败 输出错误信息
            return EsUtils::stdMessage(false, $ex->getError());
        }
        // 更新到数据库
        try {
            $affected = self::where('id', $id)->update($data);
            EsUtils::stdMessage(true, '', $affected);
        } catch (PDOException $ex) {
            EsUtils::stdMessage(false, $ex->getMessage());
        }
    }

    /**
     * 删除指定的资源
     * @param int $id 主键编号
     */
    static function doDelete($id)
    {
        try {
            $affected = self::destroy($id);
            EsUtils::stdMessage(true, '', $affected);
        } catch (PDOException $ex) {
            EsUtils::stdMessage(false, $ex->getMessage());
        }
    }

    /**
     * 返回菜单和权限数据
     */
    public static function getMenus($userId)
    {
        $groupName = Db::table(AuthAdminsModel::TABLE_NAME)->where('id', $userId)->value('group_name');
        $ruleIds = Db::table(AuthGroupsModel::TABLE_NAME)->where('group_name', $groupName)->value('rule_ids');
        $list = Db::table(self::TABLE_NAME)->where('id', 'in', $ruleIds)->where('pid');
        $tree = EsArray::list2tree($list, 0);
        return EsUtils::stdMessage(true, '', $tree);
    }
}
